package xyz.yq56.easytool.utils.recursion;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

import xyz.yq56.easytool.abs.TreeNode;
import xyz.yq56.easytool.utils.collection.CollectUtil;

/**
 * @author yi qiang
 * @date 2021/10/5 14:33
 */
public class RecursionUtil {

    private RecursionUtil() {
    }

    /**
     * 使用时,只要node实现TreeNode接口即可实现树形菜单
     * <br> 实现逻辑很简单：
     * <br> 找到子类，并给children设值
     * <br> 由于子类可能还有子类，故在子类内部递归调用，找到子类的子类
     *
     * @param list 树形结构的扁平数据
     * @param node 根节点
     * @param <T>  泛型,只要实现TreeNode接口即可生成树形结构
     */
    public static <T extends TreeNode> void buildTree(List<T> list, T node) {
        if (CollectUtil.isEmpty(list)) {
            return;
        }
        List<T> children = new ArrayList<>();
        for (T menu : list) {
            if (Objects.equals(menu.getPid(), node.getId())) {
                children.add(menu);
                buildTree(getRemainList(list, menu.getPid()), menu);
            }
        }
        if(!CollectUtil.isEmpty(children)){
            node.setChildren(children);
        }

    }

    /**
     * 获取到的剩余集合会越来越少,避免堆栈溢出
     *
     * @param list list
     * @param pid  pid
     * @return 剩余集合
     */
    private static <T extends TreeNode> List<T> getRemainList(List<T> list, String pid) {
        return CollectUtil.filter(list,item -> !Objects.equals(item.getPid(), pid));
    }


}
